package koby99;

public class J17_OOP3 {

	// 생성자
	
	// this 연산자, this 생성자
	// 멤버변수에 사용하는 this는 현재 클래스 자신을 의미
	// 생성자에 사용하는 this는 코드 간결성을 위해 사용
	public static void main(String[] args) {
		// 생성자를 이용해 객체를 만들고 
		// 맴버변수에 값을 직접 초기화 
		Member user01 = new Member();
		user01.userid = "2221a";
		user01.passwd = "12345";
		
		// 기본생성자만을 이용해서 
		// 맴버변수 초기화
		Member user02 = new Member();
		user02.showInfo();
		
		//인자있는 생성자로 객체 생성
		Member user03 = new Member("kokobol","2345");
		user03.showInfo();
		
		Car mycar01 = new Car();// 이렇게 인자가 있을경우
//								 빈생성자가 성립이 되지 않음.
//								 이 오류를 없애려면 인자를 없애거나,
//								 새로운 인자 없는 생성자를 생성하면 된다. 	
		Car mycar02 = new Car("BMW","RED");
		//이렇게 생성자가 두개(인자있는것과 없는것)로 사용가능.
	}

}// class
class Member{
	String userid;
	String passwd;
	
	//기본 생성자[인자 없음]
	public Member(){
		userid = "the";
		passwd = "29293";				
	}
	//생성자 [인자 있음]
	public Member(String myuserid, String mypasswd){
		userid = myuserid;
		passwd = mypasswd;
	
	}
	
	//회원정보 출력 showInfo
	void showInfo(){
		System.out.println(userid);
		System.out.println(passwd);
	}
}
class Car{
	String brand;
	String color;

	public Car(){}
	// 인자 있는 생성자를 사용하는 경우
	// 기번 생성자도 직접 만들어 둬야 함
	
	public Car(String mybrand, String mycolor){
		brand = mybrand;
		color = mycolor;
	}
}

class DVD{
	int dvdno;
	String dvdtitle;
	String genre;
	
	public DVD() {}
	public DVD(int dvdno, String dvdtitle, String genre){
		// 생성자의 인자명과 맴버변수명은 동일하게 작성
		// 왜냐하면, 생성자의 인자명을 새로 짓는것은 귀찮기 때문
		this.dvdno = dvdno;
		this.dvdtitle = dvdtitle;
		this.genre = genre;
		// 생성자(메서드)의 인자명과 맴버변수명이 서로 같은 경우
		// 멤버 변수 보다 메서드 변수의 값이 우선된다.
		// 고로 그냥 dvdno = dvdno한다면
		// 메서드에서 선언된 변수 값이 우선되기 때문에
		// 멤버에 값에 변화가 없어지게 된다
		// 이를 멤버변수가리기shadowing 현상이라고 함
		// 따라서, 클래스의 멤버변수는 this 연산자를
		// 이용해서 가리기 현상을 방지 할수 있다.
	}
}

class Book{
	int bookno;
	String booktitle;
	String genre;
	
	public Book(){ 	}
	public Book(int bookno){
		this.bookno = bookno;
	}
	public Book(String booktitle){
		this.booktitle = booktitle;
	}
	public Book(int bookno, String booktitle){
//		this.bookno;;
//		this.booktitle;;
//		Book(bookno);     //첫번째 줄 코드를 간단히 쓰기
//		Book(booktitle);  //두번째 줄 코드를 간단히 쓰기
		this(bookno);     //첫번째 줄 코드를 this() 대체
		//this(booktitle);//두번째 줄 코드를 this() 대체
		//단, this()는 언제나 코드의 맨 처음에 나와야 함
	}
	
}

